home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / games / spassion / source.lzh / SOURCE / FuncEnemy / BUBBLE.C < prev    next >
Text File  |  2000-03-29  |  5KB  |  226 lines

  1. /*
  2. #include <stdio.h>
  3. #include <iocslib.h>
  4. void    key_wait( void );
  5. #define BIT(i)        (1<<(i))
  6. */
  7. /*
  8. アイテムを持っている敵
  9. とりあえずサイン波的な動き
  10. */
  11. #include <xsp2lib.h>
  12. #include "../SPASSION.H"
  13. #include "../player.h"
  14. #include "../enemy.h"
  15. #include "../eshot.h"
  16. #include "../effect.h"
  17. #include "../priority.h"
  18. #include "../sound.h"
  19. #include "../entry.h"
  20. #ifndef NULL
  21. #define NULL ((void *) 0)
  22. #endif
  23.  
  24. #define PALET_MAIN    0x0600
  25.  
  26. static short MoveEnemyBubble_L( ENEMY *ene );
  27. /*static void TiniEnemyBubble_L(ENEMY *);*/
  28. static short MoveEnemyBubble(ENEMY *);
  29. /*static void TiniEnemyBubble(ENEMY *);*/
  30.  
  31. #define PT_ST_L        0x7
  32. #define PT_END_L    0xA
  33. #define PT_ST        0x13
  34. #define PT_END        0x16
  35.  
  36. static HIT_XY4    hitl_p[]={-6-PLAYER_HIT_X,-6-PLAYER_HIT_Y,6+PLAYER_HIT_X,6+PLAYER_HIT_Y};
  37. static HIT_XY4    hitl_o[]={-6-OPTION_HIT_X,-6-OPTION_HIT_Y,6+OPTION_HIT_X,6+OPTION_HIT_Y};
  38. static HIT_XY4    hitl_s[]={-6,-6,6,6};
  39.  
  40. /* 16x16キャラの当たり判定 */
  41. extern HIT_XY4    hit8_p;
  42. extern HIT_XY4    hit8_o;
  43. extern HIT_XY4    hit8_s;
  44. static unsigned char seed=0;
  45.  
  46. void InitEnemyBubble_LHit( void )
  47. {
  48. }
  49. /* InitEnemyZako00Hitと同じなのでいらない */
  50. void InitEnemyBubbleHit( void )
  51. {
  52. }
  53.  
  54. void InitEnemyBubble_L(ENEMY *ene)
  55. {
  56.     short    pal[8]= {0x100,0x600,0x600,0x700,0x800,0xA00,0xB00,0xC00};
  57.  
  58. /*    ene->info         = PALET_MAIN | PRIORITY_ZAKO;*/
  59.     ene->info         = pal[rndtable[seed++]&7] | PRIORITY_ZAKO;
  60.     seed&=255;
  61.     ene->vx             = (ene->arg>>8          ) * 32768;        /* 引数の上位バイトをvxにする */
  62.     ene->vy             = ((char)(ene->arg&0xFF)) * 32768;        /* 引数の下位バイトをvyにする */
  63.     ene->hit_p[0]     = &hitl_p[0];ene->hit_p[1]=NULL;
  64.     ene->hit_o[0]     = &hitl_o[0];ene->hit_o[1]=NULL;
  65.     ene->hit_s[0]     = &hitl_s[0];ene->hit_s[1]=NULL;
  66.     ene->hp             = 20;
  67.     ene->no_dead     = 1;
  68.     ene->func_enemy_move = MoveEnemyBubble_L;
  69. /*    ene->func_enemy_tini = TiniEnemyBubble_L;*/
  70. }
  71.  
  72.  
  73. void InitEnemyBubble(ENEMY *ene)
  74. {
  75.     int        pvx,pvy;
  76.  
  77.     /* 速度を落とす */
  78.     if( ene->parent->vx < 0 )
  79.         pvx=ene->parent->vx*-1;
  80.     else
  81.         pvx=ene->parent->vx;
  82.     if( ene->parent->vy < 0 )
  83.         pvy=ene->parent->vy*-1;
  84.     else
  85.         pvy=ene->parent->vy;
  86.  
  87.     if( pvx>>16 < (ene->vx = (rndtable[seed++] & 0x3)) )
  88.         ene->vx=ene->parent->vx/2;
  89.     else
  90.         ene->vx *= 32768;
  91.     seed&=255;
  92.     if( rndtable[seed++]>127 )
  93.         ene->vx *= -1;
  94.     seed&=255;
  95.  
  96.     /* 速度を落とす */
  97.     if( pvy>>16 < (ene->vy = (rndtable[seed++] & 0x3)) )
  98.         ene->vy=ene->parent->vy/2;
  99.     else
  100.         ene->vy *= 32768;
  101.     seed&=255;
  102.  
  103.     if( rndtable[seed++]>127 )
  104.         ene->vy *= -1;
  105.     seed&=255;
  106.  
  107.     ene->info         = ene->arg;
  108.     ene->hit_p[0]     = &hit8_p;ene->hit_p[1]=NULL;
  109.     ene->hit_o[0]     = &hit8_o;ene->hit_o[1]=NULL;
  110.     ene->hit_s[0]     = &hit8_s;ene->hit_s[1]=NULL;
  111.     ene->hp             = 10;
  112.     ene->no_dead     = 1;
  113.     ene->func_enemy_move = MoveEnemyBubble;
  114. /*    ene->func_enemy_tini = TiniEnemyBubble;*/
  115. }
  116.  
  117.  
  118. static short MoveEnemyBubble_L( ENEMY *ene )
  119. {
  120. /*    short    anim_num;*/
  121.  
  122.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  123.     ene->x = ((ene->lx += ene->vx) >> 16);
  124.     ene->y = ((ene->ly += ene->vy) >> 16);
  125.  
  126.     ene->pt = obj_obj_b+PT_ST_L+(ene->anim_count++)/8;
  127.     if( ene->pt > obj_obj_b+PT_END_L ){
  128.         ene->pt = obj_obj_b+PT_ST_L;
  129.         ene->anim_count=0;
  130.     }
  131. #if 0
  132.     if(ENE_X < 128){
  133.         ene->lx = 128*65536;
  134.         ene->ly = 128*65536;
  135.         ene->vx = 0;
  136.         ene->vy = 0;
  137.     }
  138.     if( BITSNS(0x04) & BIT(1) ){
  139.         while( BITSNS(0x04) & BIT(1) );
  140.         entry_counter_stop = 0;
  141.         return (0);
  142.     }
  143. #endif
  144.     /* 画面外に出たら消去 */
  145.     if( ENE_X < 16 - 16 || ENE_X > 255 + 32 || ENE_Y < 16 - 16 || ENE_Y > 255 + 32 )
  146.         return (0);
  147.  
  148.     /* ダメージを受けた時の処理 */
  149. #if 1
  150.     if(ene->damage){
  151.         if( ene->damage_kind!=PLAYER_ATTACK ){
  152.             if((ene->hp -= ene->damage) <= 0) {
  153.                 SetSE(SE_EXPL_BUBBLE);    /* 爆発音 */
  154.                 ene->player->score += 5;
  155.                 MakeEnemy(ENEMY_BUBBLE , ene->x  , ene->y, ene->info,  ene);    /* 泡(小)生成 */
  156.                 MakeEnemy(ENEMY_BUBBLE , ene->x  , ene->y, ene->info,  ene);    /* 泡(小)生成 */
  157.                 return (0);        /* 消去 */
  158.             }
  159.         }else if( ene->player->state==PLAYER_ALIVE ){
  160.             ene->player->x = ((ene->player->lx = ene->lx-(5<<16)) >> 16);
  161.             ene->player->y = ((ene->player->ly = ene->ly        ) >> 16);
  162.             ene->damage_kind=0;
  163.         }
  164.         ene->damage = 0;
  165.     }
  166. #endif
  167.  
  168.     xobj_set_st(ene);
  169.  
  170.     return(1);
  171. }
  172.  
  173. static short MoveEnemyBubble( ENEMY *ene )
  174. {
  175. /*    short    anim_num;*/
  176.  
  177.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  178.     ene->x = ((ene->lx += ene->vx) >> 16)-8;    /*-8は表示位置をずらすため*/
  179.     ene->y = ((ene->ly += ene->vy) >> 16)-8;
  180.  
  181.     ene->pt = obj_obj+PT_ST+(ene->anim_count++)/8;
  182.     if( ene->pt > obj_obj+PT_END ){
  183.         ene->pt = obj_obj+PT_ST;
  184.         ene->anim_count=0;
  185.     }
  186. #if 0
  187.     if(ENE_X < 128){
  188.         ene->lx = 64*65536;
  189.         ene->ly = 192*65536;
  190.         ene->vx = 0;
  191.         ene->vy = 0;
  192.     }
  193.     if( BITSNS(0x04) & BIT(1) ){
  194.         while( BITSNS(0x04) & BIT(1) );
  195.         entry_counter_stop = 0;
  196.         return (0);
  197.     }
  198. #endif
  199.  
  200.     /* 画面外に出たら消去 */
  201.     if( ENE_X < 16 - 8 || ENE_X > 255 + 24 || ENE_Y < 16 - 8 || ENE_Y > 255 + 24 )
  202.         return (0);
  203.  
  204.     /* ダメージを受けた時の処理 */
  205. #if 1
  206.     if(ene->damage){
  207.         if((ene->hp -= ene->damage) <= 0) {
  208.             SetSE(SE_EXPL_BUBBLE);    /* 爆発音 */
  209.             ene->player->score += 1;
  210.             return (0);        /* 消去 */
  211.         }
  212.         ene->damage = 0;
  213.     }
  214. #endif
  215.  
  216.     xsp_set_st(ene);
  217.  
  218.     return(1);
  219. }
  220.  
  221. /*
  222. static void TiniEnemyBubble(ENEMY * p)
  223. {
  224. }
  225. */
  226.